﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using CuaHangMayTinh.BusinessEntities;
using CuaHangMayTinh.BusinessLogicLayer;
using CuaHangMayTinh.PresentationLayer.Report;
using CuaHangMayTinh.Utilities;
using DevComponents.DotNetBar.Controls;
using Microsoft.VisualBasic;

namespace CuaHangMayTinh.PresentationLayer
{
    /// <summary>
    /// form nhập hàng
    /// </summary>
    public partial class FormNhapHang : Form
    {
        /// <summary>
        /// tạo đối tượng đổi sang chữ số
        /// </summary>
        private DoiSoSangChu doichuso = new DoiSoSangChu(1);

        /// <summary>
        /// danh sách đơn vị tính
        /// </summary>
        private List<DonViTinhEntity> listDonViTinhEntities = DonViTinhManager.ConvertToList(DonViTinhManager.Find_All());

        /// <summary>
        /// tạo mới nhập hàng entity
        /// </summary>
        private NhapHangEntity nhapHangEntity = new NhapHangEntity();

        /// <summary>
        /// tạo 1 danh sách chứa các chi tiết nhập hàng
        /// </summary>
        private List<ChiTietNhapHangEntity> dsChiTietNhapHangEntities = new List<ChiTietNhapHangEntity>();

        /// <summary>
        /// tạo 1 danh sách chứa các model mặt hang
        /// </summary>
        private List<ModelMatHangEntity> dsModelMatHangEntities = new List<ModelMatHangEntity>();

        /// <summary>
        /// tạo mới 1 list lưu trữ tên các nhà cung cấp
        /// </summary>
        private List<string> tennhacungcap = new List<string>();

        /// <summary>
        /// tạo mới 1 list danh sách mặt hangf
        /// </summary>
        private List<MatHangEntity> dsmathang = new List<MatHangEntity>();

        /// <summary>
        /// tạo 1 datatable
        /// </summary>
        private DataTable table;

        /// <summary>
        /// lưu số luơng
        /// </summary>
        private int TongSoLuong = 0;

        /// <summary>
        /// lưu giá trị tổng tiền
        /// </summary>
        private decimal TongTien = 0;

        private NhaCungCapEntity nhaCungCapEntity;

        private string Text = string.Empty;

        /// <summary>
        /// phương thức khởi tạo
        /// </summary>
        public FormNhapHang()
        {
            InitializeComponent();
        }

        private NhanVienEntity NhanVien;

        public FormNhapHang(NhanVienEntity nvEntity)
            : this()
        {
            NhanVien = nvEntity;
        }

        /// <summary>
        /// phương thức load
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormNhapHang_Load(object sender, EventArgs e)
        {
            LoadForm();
        }

        /// <summary>
        /// 
        /// </summary>
        void LoadForm()
        {
            var form = (FormChinh)this.MdiParent;
            NhanVien = form.NhanVien;
            table = CreateDatable();
            nhapHangEntity = new NhapHangEntity();

            nhaCungCapEntity = new NhaCungCapEntity();

            dsChiTietNhapHangEntities = new List<ChiTietNhapHangEntity>();

            dsModelMatHangEntities = new List<ModelMatHangEntity>();

            tennhacungcap = new List<string>();

            dsmathang = new List<MatHangEntity>();
            LoadModelMatHangToCbb();
            LoadNhaCungCapToCbb();
            dtime_ngaylap.Value = DateTime.Now;
            buttonX_themmathang.Enabled = true;
            buttonX_xoa.Enabled = true;
            btn_luutru.Enabled = true;
            dataGridViewX_Select.DataSource = null;
            label_soluong.Text = "0";
            label_tongtien.Text = "0";
            label_sotienchu.Text = "";
        }

        /// <summary>
        /// bắt sự kiện click nút excel 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX_excel_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Excel 2007 Files|*.xlsx";
            if (open.ShowDialog() == DialogResult.OK)
            {
                using (FileStream fs = new FileStream(open.FileName, FileMode.Open))
                {
                    try
                    {
                        DataTable x = ExcelLibrary.GetDataWorkSheet(fs, "DanhSachModelMatHang");
                        dataGridViewX_Select.DataSource = ADDtable(x);
                        decimal j = decimal.Parse(x.Rows[0]["GiaNhap"].ToString());
                        var f = x.AsEnumerable().Select(g => decimal.Parse(g.Field<string>("GiaNhap"))).Sum();
                        TongSoLuong += x.AsEnumerable().Count();
                        TongTien += f;
                        label_soluong.Text = TongSoLuong.ToString();
                        label_tongtien.Text = TongTien + " Đồng";
                        doichuso.So = Convert.ToInt32(TongTien);
                        label_sotienchu.Text = doichuso.ToString();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Phải đặt tên sheet là DanhSachModelMatHang");
                    }
                }
            }
        }

        /// <summary>
        /// load model mặt hàng lên combobox
        /// </summary>
        private void LoadModelMatHangToCbb()
        {
            try
            {
                DataTable dt = DataUtil.ChangeColumn(ModelMatHangManager.Find_All(true));
                comboBoxEx_modelmathang.DataSource =
                    dt.AsEnumerable().Where(x => x.Field<int>("Tình trạng") != 0).CopyToDataTable();
                comboBoxEx_modelmathang.DisplayMember = "Model";
                comboBoxEx_modelmathang.DropDownColumns = "Model,Hãng sản xuất,Nước sản xuất,Bảo hành";
                comboBoxEx_modelmathang.DropDownWidth = 400;
            }
            catch
            {

            }

        }

        /// <summary>
        /// load nhà cung cấp lên combobox
        /// </summary>
        private void LoadNhaCungCapToCbb()
        {
            DataTable dt = DataUtil.ChangeColumn(NhaCungCapManager.Find_All());
            cbb_nhacungcap.DataSource = dt;
            cbb_nhacungcap.DisplayMember = "Tên nhà cung cấp";
            cbb_nhacungcap.DropDownColumns = "Tên nhà cung cấp,Mã số thuế,Số điện thoại,Địa chỉ";
            cbb_nhacungcap.DropDownWidth = 400;
            SetAutoCompleNhaCungCap(dt);
            EnableNhaCungCap(false);
        }

        /// <summary>
        /// set giá trị autocomple cho textbox tên nhà cung cấp
        /// </summary>
        /// <param name="dt"></param>
        private void SetAutoCompleNhaCungCap(DataTable dt)
        {
            if (dt != null)
            {
                foreach (DataRow row in dt.Rows)
                {
                    tennhacungcap.Add(row[1].ToString());
                }
            }
            txt_Ten.AutoCompleteCustomSource.AddRange(tennhacungcap.ToArray());
        }

        /// <summary>
        /// bắt sự kiện khi thay đổi cbb của nhà cung cấp
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxEx_nhacungcap_SelectedIndexChanged(object sender, EventArgs e)
        {
            cbb_nhacungcap.Text = "...";
            ComboBoxEx ex = sender as ComboBoxEx;
            DataRowView row = (DataRowView)ex.SelectedItem;
            SetNhaCungCapEntity(row);
            EnableNhaCungCap(false);
        }

        /// <summary>
        /// hiển thị hoặc ẩn đi phần nhập nhà cung cấp
        /// </summary>
        /// <param name="i"></param>
        private void EnableNhaCungCap(bool i)
        {
            txt_masothue.Enabled = i;
            txt_diachi.Enabled = i;
            txt_sodienthoai.Enabled = i;
        }

        /// <summary>
        /// lấy row chuyển lên form
        /// </summary>
        /// <param name="row"></param>
        private void SetNhaCungCapEntity(DataRow row)
        {
            txt_Ten.Text = row[1].ToString();
            txt_masothue.Text = row[2].ToString();
            txt_diachi.Text = row[3].ToString();
            txt_sodienthoai.Text = row[4].ToString();
        }

        /// <summary>
        /// lấy datarowview chuyển lên form
        /// </summary>
        /// <param name="row"></param>
        private void SetNhaCungCapEntity(DataRowView row)
        {
            txt_Ten.Text = row[1].ToString();
            txt_masothue.Text = row[2].ToString();
            txt_diachi.Text = row[3].ToString();
            txt_sodienthoai.Text = row[4].ToString();
        }

        /// <summary>
        /// bắt sự kiện click nút lưu trữ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX_luutru_Click(object sender, EventArgs e)
        {
            DataTable dt = (DataTable)dataGridViewX_Select.DataSource;
            if (dt == null || dt.Rows.Count < 1)
            {
                MessageBox.Show("Chưa nhập thông tin !");
                return;
            }
            int x = GetAllEntity(dt);
            if (x > 0)
            {

                MessageBox.Show("Nhập hàng thành công !");
                btn_In.Enabled = true;
                toolStripBtn_taomoi.Enabled = true;
                toolStripbtn_xuatexcel.Enabled = true;
                buttonX_themmathang.Enabled = false;
                buttonX_xoa.Enabled = false;
                btn_luutru.Enabled = false;
            }
            else
            {
                MessageBox.Show("Lỗi nhập hàng !");
            }

        }

        private NhaCungCapEntity GetNhaCungCapEntity()
        {
            return new NhaCungCapEntity()
            {
                TenNCC = txt_Ten.Text,
                DiaChi = txt_diachi.Text,
                MaSoThue = txt_masothue.Text,
                SoDT = txt_sodienthoai.Text,
                Email = "",
                GhiChu = ""
            };
        }

        private bool CheckInput()
        {
            if (StringHelper.IsNullorEmpty(txt_Ten.Text))
            {
                MessageBox.Show("Vui lòng nhập tên nhà cung cấp");
                return false;
            }
            if (StringHelper.IsNullorEmpty(txt_masothue.Text))
            {
                MessageBox.Show("Vui lòng nhập mã số thuế");
                return false;
            }
            if (StringHelper.IsNullorEmpty(txt_sodienthoai.Text))
            {
                MessageBox.Show("Vui lòng nhập tên nhà cung cấp");
                return false;
            }
            if (!DataUtil.KiemTraSoDt(txt_sodienthoai.Text))
            {
                MessageBox.Show("Bạn nhập số điện thoại không đúng định dạng");
                return false;
            }
            return true;
        }

        /// <summary>
        /// lấy danh sách các entity từ datagir lên 
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        private int GetAllEntity(DataTable dt)
        {
            int idnhacungcap = 0;
            if (tennhacungcap.Contains(txt_Ten.Text))
            {
                idnhacungcap = NhaCungCapManager.GetID(txt_Ten.Text);
            }
            else
            {

                if (CheckInput())
                {
                    idnhacungcap = NhaCungCapManager.InsertGetID(GetNhaCungCapEntity(), ref Text);
                    if (idnhacungcap == 0)
                    {
                        MessageBox.Show(Text);
                        return 0;
                    }
                }
            }
            ///lấy ds model mặt hàng
            List<string> dsmodelmathang = new List<string>();
            foreach (DataRow row in dt.Rows)
            {
                dsmodelmathang.Add(row[1].ToString());
            }
            var dsmodelmathangdt = dsmodelmathang.Distinct().ToList();
            ///lấy danh sách model mặt hàng

            int dem = 0;
            foreach (string model in dsmodelmathangdt)
            {
                DataRow row = dt.AsEnumerable().Where(x => x.Field<string>("ModelMatHang") == model).First();
                ModelMatHangEntity entity = new ModelMatHangEntity
                {
                    MaModelMH = dem,
                    MaLoaiMH = LoaiMatHangManager.GetID(row.Field<string>("LoaiMatHang")),
                    //MaModelMH = dsModelMatHangEntities.Count,
                    Model = model,
                    HangSX = row.Field<string>("HangSX"),
                    NuocSX = row.Field<string>("NuocSX"),
                    CauHinh = row.Field<string>("CauHinh"),
                    BaoHanh = int.Parse(row.Field<string>("BaoHanh")),
                    //get id cua ma donvi tinh
                    MaDonViTinh = DonViTinhManager.GetID_Ten(row.Field<string>("DonVitinh"))
                };
                ChiTietNhapHangEntity ctnhapentiyEntity = new ChiTietNhapHangEntity
                {
                    MaHDNH = 0,
                    MaModelMH = dem,
                    SoLuong = 0,
                    GiaNhap = Convert.ToDecimal(row.Field<string>("GiaNhap"))
                };
                dsChiTietNhapHangEntities.Add(ctnhapentiyEntity);
                dsModelMatHangEntities.Add(entity);
                dem++;
            }
            dem = 0;
            ///lấy danh sách mặt hàng theo từng model
            foreach (ModelMatHangEntity modelMatHangEntity in dsModelMatHangEntities)
            {

                dsmathang = new List<MatHangEntity>();
                var mutilrow = dt.AsEnumerable().Where(x => x.Field<string>("ModelMatHang") == modelMatHangEntity.Model);
                foreach (DataRow row in mutilrow)
                {
                    MatHangEntity matHangEntity = new MatHangEntity
                    {
                        MaModelMH = modelMatHangEntity.MaModelMH,
                        Serial_Code = row.Field<string>("Serial")
                    };
                    dsmathang.Add(matHangEntity);
                }
                modelMatHangEntity.ListMatHang = dsmathang;
                dsChiTietNhapHangEntities[dem].SoLuong = dsmathang.Count();
                //dsChiTietNhapHangEntities.FirstOrDefault(x => x.MaModelMH == modelMatHangEntity.MaModelMH).SoLuong =
                //dsmathang.Count();
                dem++;
            }

            ///tao nhap hang entity
            nhapHangEntity = new NhapHangEntity
            {
                MaHoaDon = txt_maphieunhap.Text,
                MaNV = NhanVien.MaNV,
                MaNCC = idnhacungcap,
                NgayLap = dtime_ngaylap.Value,
                TongTien = TongTien,
                GhiChu = txt_ghichu.Text,
                ListChiTietNhap = dsChiTietNhapHangEntities,
                ListModel = dsModelMatHangEntities
            };
            try
            {
                nhaCungCapEntity = NhaCungCapManager.ConvertToList(NhaCungCapManager.Find_ID(idnhacungcap))[0];
                return NhapHangManager.InsertTS(nhapHangEntity);
            }
            catch (Exception)
            {
                return 0;
            }

        }

        /// <summary>
        /// tạo mới 1 datable có định kiểu
        /// </summary>
        /// <returns></returns>
        private DataTable CreateDatable()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Serial");
            dt.Columns.Add("ModelMatHang");
            dt.Columns.Add("HangSX");
            dt.Columns.Add("NuocSX");
            dt.Columns.Add("BaoHanh");
            dt.Columns.Add("CauHinh");
            dt.Columns.Add("GiaNhap");
            dt.Columns.Add("LoaiMatHang");
            dt.Columns.Add("DonVitinh");
            return dt;
        }

        /// <summary>
        /// sự kiện thêm mới mặt hàng
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX_themmathang_Click(object sender, EventArgs e)
        {
            DataTable dt = table.Clone();
            var row = (DataRowView)comboBoxEx_modelmathang.SelectedValue;
            int mamodel = (int)row[0];
            dsmathang = new List<MatHangEntity>();
            string x = Interaction.InputBox("Nhập số lượng mặt hàng vào", "Thông báo!", "");
            int soluong = 0;
            int gianhap = 0;
            try
            {
                soluong = int.Parse(x);
            }
            catch (Exception)
            {
                MessageBox.Show("Bạn nhập vào bị lỗi");
                return;
            }
            string serial;
            for (int i = 0; i < soluong; i++)
            {
                serial = Interaction.InputBox("Nhập serial của măt hàng thứ " + (i + 1), "Thông báo!", "");
                if (serial == "")
                    return;
                MatHangEntity entiy = new MatHangEntity(mamodel, 0, 0, 0, serial, 0, 0);
                dsmathang.Add(entiy);
            }
            x = Interaction.InputBox("Nhập giá của model này", "Thông báo!", "");
            try
            {
                gianhap = int.Parse(x);
            }
            catch (Exception)
            {
                MessageBox.Show("Bạn nhập vào bị lỗi");
                return;
            }
            //            chiTietNhapHangEntity = new ChiTietNhapHangEntity(0, mamodel, soluong, gianhap);
            //            dsChiTietNhapHangEntities.Add(chiTietNhapHangEntity);

            foreach (MatHangEntity matHangEntity in dsmathang)
            {
                ///xem lai cai don bi tinh
                dt.Rows.Add(new[]
                {
                    matHangEntity.Serial_Code,
                    (string) row[1],
                    (string) row[3],
                    (string) row[4],
                    row[7].ToString(),
                    (string) row[5],
                    gianhap.ToString(),
                    (string) row[2],
                    (string) row[8],
                });
            }
            dataGridViewX_Select.DataSource = ADDtable(dt);
            TongSoLuong += soluong;
            TongTien += gianhap * soluong;
            label_soluong.Text = TongSoLuong.ToString();
            label_tongtien.Text = TongTien + " Đồng";
            doichuso.So = Convert.ToInt32(TongTien);
            label_sotienchu.Text = doichuso.ToString();
        }

        /// <summary>
        /// trộn 2 database với nhau
        /// </summary>
        /// <param name="dt1"></param>
        /// <returns></returns>
        private DataTable ADDtable(DataTable dt1)
        {
            DataTable dt2 = (DataTable)dataGridViewX_Select.DataSource;
            if (dt2 == null)
            {
                dt2 = table.Clone();
            }
            dt2.Merge(dt1);
            return dt2;
        }

        /// <summary>
        /// sự kiện leave của textbox nhà cung cấp
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void textBoxX_Ten_Leave(object sender, EventArgs e)
        {
            if (tennhacungcap.Contains(txt_Ten.Text))
            {
                DataTable dt = (DataTable)cbb_nhacungcap.DataSource;
                var results = dt.AsEnumerable();
                DataRow kq = results.FirstOrDefault(x => x.Field<string>("Tên nhà cung cấp") == txt_Ten.Text);
                SetNhaCungCapEntity(kq);
                EnableNhaCungCap(false);
            }
            else
            {
                EnableNhaCungCap(true);
            }

        }

        private void buttonX_themmodelmathang_Click(object sender, EventArgs e)
        {
            FormModelMatHangThem formModelMatHangThem = new FormModelMatHangThem();
            if (formModelMatHangThem.ShowDialog() == DialogResult.OK)
                LoadModelMatHangToCbb();
        }

        private void buttonX_xoa_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow selectrow in dataGridViewX_Select.SelectedRows)
            {
                TongTien -= decimal.Parse((string)selectrow.Cells[6].Value);
                dataGridViewX_Select.Rows.Remove(selectrow);
                TongSoLuong -= 1;

            }
            label_soluong.Text = TongSoLuong.ToString();
            label_tongtien.Text = TongTien + " Đồng";
            doichuso.So = Convert.ToInt32(TongTien);
            label_sotienchu.Text = doichuso.ToString();
        }

        private void toolStripBtn_excel_Click(object sender, EventArgs e)
        {
            buttonX_excel_Click(null, null);
        }

        private void buttonX_In_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < nhapHangEntity.ListChiTietNhap.Count; i++)
            {
                nhapHangEntity.ListChiTietNhap[i].MaModelMH = i;
                nhapHangEntity.ListModel[i].MaModelMH = i;
            }
            var form = (FormChinh)this.MdiParent;
            FormReportHoaDon reportHoaDon = new FormReportHoaDon(nhapHangEntity, form.NhanVien, nhaCungCapEntity,
                listDonViTinhEntities, true);
            reportHoaDon.ShowDialog();
        }

        private void toolStripBtn_In_Click(object sender, EventArgs e)
        {
            buttonX_In_Click(null, null);
        }

        private void textBoxX_sodienthoai_KeyPress(object sender, KeyPressEventArgs e)
        {
            DataUtil.PressInt(e);
        }

        private void toolStripbtn_xuatexcel_Click(object sender, EventArgs e)
        {
            SaveFileDialog save = new SaveFileDialog();
            save.Filter = "Excel 2007 Files|*.xlsx";
            if (save.ShowDialog() == DialogResult.OK)
            {

                Byte[] bytes = ExcelLibrary.ExportExcel((DataTable)dataGridViewX_Select.DataSource, "nhập hàng", save.FileName);
                string filePath = Path.Combine(Path.GetDirectoryName(Path.GetDirectoryName(Application.StartupPath)),
                    save.FileName);
                File.WriteAllBytes(filePath, bytes);
                if (MessageBox.Show("Bạn có muốn mở files lên không!", "Thông báo !", MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    ProcessStartInfo pi = new ProcessStartInfo(filePath);
                    Process.Start(pi);
                }
            }
        }

        private void toolStripBtn_taomoi_Click(object sender, EventArgs e)
        {
            LoadForm();
        }



    }
}
